package controllers;

import java.util.HashMap;
import java.util.Map;

import models.Alimento;
import models.Comible;
import models.ComidaDieta;
import models.Dieta;
import models.EstablecimientoAlimenticio;
import models.Ingerido;
import models.Paciente;
import models.Perfil;
import models.PerfilEA;
import models.Plan;
import play.data.binding.Binder;
import play.db.Model;
import play.exceptions.TemplateNotFoundException;
import play.mvc.With;
import controllers.securesocial.SecureSocial;

@With(SecureSocial.class)
public class Perfils extends CustomCRUD {
	
	public static void index() {
		
		Perfil perfil = getPerfil();
		
		render(perfil);
		
	}
	
	public static Perfil getPerfil() {
		
		Paciente paciente = (Paciente) getUsuarioLogueado();
		
		return paciente.getPerfil() != null ? paciente.getPerfil() : Perfil.findPerfil(paciente.getId());
	}
	
	public static void show(String id) throws Exception {

		ObjectType type = ObjectType.get(getControllerClass());
		notFoundIfNull(type);

		Perfil object = getPerfil();

		notFoundIfNull(object);

		try {
			render(type, object);
		} catch (TemplateNotFoundException e) {
			render(getControllerName() + "/show.html", type, object);
		}
	}
	
	/**
	 * Muestra el perfil del establecimiento alimenticio... ver si quede asi o mejorar
	 */
	public static void showPerfilEA(String id) throws Exception {

		ObjectType type = ObjectType.get(getControllerClass());
		notFoundIfNull(type);

		EstablecimientoAlimenticio ea = (EstablecimientoAlimenticio) getUsuarioLogueado();
		PerfilEA object = ea.getPerfil();
		notFoundIfNull(object);

		try {
			render(type, object);
		} catch (TemplateNotFoundException e) {
			render(getControllerName() + "/showPerfilEA.html", type, object);
		}
	}
	
	/**
	 * Guarda la edicion del perfil del establecimiento alimenticio, es una modificacion del save() heredado
	 */
	public static void savePerfilEA(String id) throws Exception {
        ObjectType type = ObjectType.get(getControllerClass());
        notFoundIfNull(type);
        
        Model object = PerfilEA.findById(Long.valueOf(id));
        notFoundIfNull(object);
        
        Binder.bindBean(params.getRootParamNode(), "object", object);
        validation.valid(object);
        if (validation.hasErrors()) {
            renderArgs.put("error", play.i18n.Messages.get("crud.hasErrors"));
            try {
                render(request.controller.replace(".", "/") + "/showPerfilEA.html", type, object);
            } catch (TemplateNotFoundException e) {
                render("CRUD/show.html", type, object);
            }
        }
        object._save();
        flash.success(play.i18n.Messages.get("crud.saved", type.modelName));
        if (params.get("_save") != null) {
            redirect("/resto");
        }
        redirect(request.controller + ".show", object._key());
    }
	
	public static void list(){
		redirect("/paciente");
	}
	
	public boolean aceptasAlimento(Perfil perfil, Alimento alimento) {
		return !perfil.getAlimentosDesagradables().contains(alimento);
	}
	
	public static boolean validateMail(String mail){
		return validation.email(mail).ok;
	}
	
	public static String cargarGraficoExcesos(Long pacienteId) throws Exception {
		
		Paciente paciente = (Paciente) Paciente.findById(pacienteId);
		
		notFoundIfNull(paciente);
		
		Plan planActivo = paciente.buscarPlanActivo();
		
		Map<Comible, Integer> excesos = new HashMap<Comible, Integer>();
		
		for (Dieta dieta : planActivo.getDietas()) {
			for (ComidaDieta comidaDieta : dieta.getComidasDieta()) {
				for (Ingerido ingerido : comidaDieta.getIngeridos()) {
					if(ingerido.getCantPorcionesSugeridas() == 0){
						excesos.put(ingerido.getComible(), ingerido.getCantPorcionesIngeridas());
					}
				}
			}
		}
		
		StringBuffer retr = new StringBuffer("[");
		
		for (Comible comible : excesos.keySet()) {
			retr.append("{").append("label: '").append(comible.getNombre()).append("',data: [[1,").append(excesos.get(comible)).append("]]},");
		}
		
		return retr.toString().substring(0, retr.toString().length() - 1) + "]"; // elimino la última coma antes de retornar y agrego ] a lo ultimo 
		
	}
	
}
